🔁 Terraform count vs for_each

📌 count

  • Terraform tracks resources by index
  • State looks like:
     resource.name[0]
     resource.name[1]
    
  • ⚠️ Removing/reordering items → index shift
  • ❌ Can cause unintended destroy & recreate
  • Avoid using it

✅ Example

variable "users" {
  type    = list(string)
  default = [
    "user1.txt",
    "user2.txt",
    "user3.txt"
  ]
}
 
variable "content" {
  default = "password: S3cr3tP@ssw0rd"
}
 
resource "local_sensitive_file" "name" {
  count    = length(var.users)
  filename = var.users[count.index]
  content  = var.content
}

📌 State format (list)

local_sensitive_file.name[0]
local_sensitive_file.name[1]

📌 for_each

Use when:

  • No index shifting like count
  • ✔️ Removing one item → only that resource is destroyed
  • Stable & production-safe
  • State looks like:
resource.name["user1.txt"]
resource.name["user2.txt"]

✅ Same Example (using for_each)

variable "users" {
  type    = list(string)
  default = [
    "user1.txt",
    "user2.txt",
    "user3.txt"
  ]
}
 
variable "content" {
  default = "password: S3cr3tP@ssw0rd"
}
 
resource "local_sensitive_file" "name" {
  for_each = toset(var.users)
  filename = each.value
  content  = var.content
}

📌 State format (map)

local_sensitive_file.name["user1.txt"]
local_sensitive_file.name["user2.txt"]